草庐IT

C++ ostringstream 奇怪的行为

全部标签

c++ - 为什么在 clang -O3 上有这种行为?

这是一个计算整数的约数的小程序。该程序确实可以正常工作。然而,问题是,在ClangC++编译器(版本3.3,主干180686)的当前主干的-O3优化标志下,程序的行为发生了变化,结果不再正确。代码代码如下:#includeconstexprunsignedlongdivisors(unsignedlongn,unsignedlongc){//Thisissupposedtosum1anytimeadivisorshowsup//intherecursionreturn!c?0:!(n%c)+divisors(n,c-1);}intmain(){//HereIprintthenumber

c++ - 与 boost::mpl 占位符评估不一致的行为

在下面的代码中(为演示而简化):namespacempl=boost::mpl;usingif1=mpl::if_,double,void>;//usingif2=mpl::if_,typenamestd::common_type::type,void>;usingapply1=boost::mpl::apply::type;//usingapply2=boost::mpl::apply::type;在std::is_same,占位符被正确替换为double,就好像实例化是显式的std::is_same这会导致正确/预期的行为。然而,在std::common_type,占位符未被替换,

c++ - 这段代码,为什么它必须显示未定义的行为?

根据[lex.phases]1.2中的这句话Exceptforsplicesrevertedinarawstringliteral,ifaspliceresultsinacharactersequencethatmatchesthesyntaxofauniversal-character-name,thebehaviorisundefined.下面的代码片段有未定义的行为(live-example):#include//Accordingto[lex.phases]1.2thishasundefinedbehaviorconstchar*p="\\u0041";intmain(){st

c++ - 哪些枚举值在 C++14 中是未定义的行为,为什么?

标准中的脚注暗示任何枚举表达式值都是已定义的行为;为什么Clang的未定义行为sanitizer程序会标记超出范围的值?考虑以下程序:enumA{B=3,C=7};intmain(){Ad=static_cast(8);returnd+B;}theundefinedbehaviorsanitizer下的输出是:$clang++-5.0-fsanitize=undefined-ggdb3enum.cc&&./a.outenum.cc:5:10:runtimeerror:loadofvalue8,whichisnotavalidvaluefortype'A'请注意,错误不在static_c

c++ - 奇怪的错误:在没有真正创建指针时使用已删除的函数 'std::unique_ptr<_Tp, _Dp>::unique_ptr

我有一个类,看起来像这样:templateusingVectorPtr=std::vector>;templateusingVectorRawPtr=std::vector;classItemsSet{//&items);~ItemsSet()=default;VectorRawPtrGetItems();VectorRawPtrGetSuitableItemsForPeriod(constIPeriod&period);doubleCalculateTotal();private:VectorPtr_items;};构造函数看起来像:ItemsSet::ItemsSet(Vector

c++ - `C == C++` 是未定义的行为吗?

一个friend告诉我:intC=anything;C==C++将具有值true.这是一个玩笑,是对经常声称的“C与C++不同”的一种反驳。但是,由于==不是序列点,我认为这实际上是未定义的行为。该程序可能首先评估C++,所以C>C++和C==C++都是未定义的。然而,C>=C++将始终评估为真。当然,翻转操作数时也是如此(C++始终为真,其他所有内容均未定义)。这个分析是否正确? 最佳答案 所有情况都导致undefinedbehavior和不可预测的结果。draftC++11standard告诉我们,除非另有说明,否则操作数的求值

C++:函数重新声明是未定义的行为吗?

代码:#includeusingnamespacestd;intf(intx=0){coutOutput(在g++5.1上测试):x:0x:1我的问题:intf(intx=1);是声明还是定义?这样的函数重新声明是未定义的行为吗? 最佳答案 来自dcl.fct.default中的§8.3.6|:Fornon-templatefunctions,defaultargumentscanbeaddedinlaterdeclarationsofafunctioninthesamescope.Declarationsindifferentsc

c++ - 当 auto 遇到多态和虚函数时,正确的行为是什么?

classB{public:virtualvoidf(){printf("B\n");}};classD:publicB{public:voidf(){printf("D\n");}};intmain(void){B*d=newD();d->f();autob=*d;b.f();}对于d->f();,输出是D。这是正确的。但是对于b.f();,输出是B。这样对吗? 最佳答案 Isthisright?没错,类型是在编译时推导的。auto使用与templateargumentdeduction相同的规则对于类型推导,基于静态类型,不考虑

c++ - vector::erase 和 std::remove_if 的奇怪行为,其结束范围不同于 vector.end()

我需要从std::vector的中间移除元素。所以我尝试了:structIsEven{booloperator()(intele){returnele%2==0;}};intelements[]={1,2,3,4,5,6};std::vectorints(elements,elements+6);std::vector::iteratorit=std::remove_if(ints.begin()+2,ints.begin()+4,IsEven());ints.erase(it,ints.end());在此之后,我希望intsvector具有:[1,2,3,5,6]。在VisualSt

c++ - Linux、Mac OS X 和 Windows 之间不同的数学舍入行为

你好,我开发了一些混合的C/C++代码,并进行了一些密集的数值计算。当在Linux和MacOSX中编译时,我在模拟结束后得到非常相似的结果。在Windows中,该程序也可以编译,但我得到的结果却截然不同,有时该程序似乎无法运行。我在所有系统中都使用了GNU编译器。有friend推荐我加上-frounding-math,现在windows版本好像运行更稳定了,但是Linux和OsX,他们的结果,一点都没有变。您能否推荐其他选项以在Win和Linux/OSX版本之间获得更多一致性?谢谢PD我还尝试了-O0(无优化)并指定了-m32 最佳答案